---
title: SAIF.Business.View.Policy business rules
summary: Enumerated business rules with per-rule trigger, enforcement, and outcomes.
status: draft
owner: SAIF Corporation
last_reviewed: 2026-08-21
library: SAIF.Business.View.Policy
reference_type: embedded
---

# SAIF.Business.View.Policy business rules

This page captures business rules enforced by this library.

## BR-VP-001 Policy number must be valid before retrieve

| Field | Value |
| --- | --- |
| **Statement** | A policy number must be valid before a policy retrieve is executed. |
| **Trigger** | Retrieving policy data |
| **Enforcement** | `clsPolicyData.vb` — `ValidPolicyNum` business rule (RuleData `clsThrdpartySettlement01`) |
| **Outcome** | Rule violation message "Error: Invalid policy number." and the retrieve is not performed |
| **SQL** | [SQL-010](sql/SQL-010-getpolicy.md) |
| **Source** | `SAIF.Business.View.Policy/clsPolicyData.vb` |

---

## BR-VP-002 Non-employer account number must not be zero

| Field | Value |
| --- | --- |
| **Statement** | A non-employer account number must not be zero. |
| **Trigger** | Retrieving a non-employer account |
| **Enforcement** | `clsNonEmployerAccount.vb` — `IsValidAccountNumber` |
| **Outcome** | Invalid account is rejected |
| **SQL** | [SQL-006](sql/SQL-006-non-employer-account-lookup.md) |
| **Source** | `SAIF.Business.View.Policy/clsNonEmployerAccount.vb` |

---

## BR-VP-003 Secure policy requires AD authorization

| Field | Value |
| --- | --- |
| **Statement** | A policy flagged with the SAIF secure policy code may only be viewed by users authorized for the `SAIFpolicyInfo` Active Directory resource. |
| **Trigger** | Policy authorization check |
| **Enforcement** | `clsPolicySecurity.vb` — `IsPolicyValidForUser` (~line 174) |
| **Outcome** | Access denied when not authorized |
| **Source** | `SAIF.Business.View.Policy/clsPolicySecurity.vb` |

---

## BR-VP-004 Invalid or zero policy number is never valid

| Field | Value |
| --- | --- |
| **Statement** | An invalid or zero policy number is never valid for any user. |
| **Trigger** | Policy authorization check |
| **Enforcement** | `clsPolicySecurity.vb` — `IsPolicyValidForUser` |
| **Outcome** | Access denied |
| **Source** | `SAIF.Business.View.Policy/clsPolicySecurity.vb` |

---

## BR-VP-005 Access granted per user-access-level matrix

| Field | Value |
| --- | --- |
| **Statement** | Access to a policy is granted according to the user access level matrix (SAIF employee, auditor, loss control, agent, group, policyholder, quick file user). |
| **Trigger** | Policy authorization check |
| **Enforcement** | `clsPolicySecurity.vb` — `IsPolicyValidForUser`, `ConvertUserTypeToUserAccessLevel` |
| **Outcome** | Access granted or denied per user type |
| **SQL** | [SQL-023](sql/SQL-023-cp-policy-in-group.md), [SQL-024](sql/SQL-024-auditor-access-count.md), [SQL-025](sql/SQL-025-cp-claimprofile-get-group-policy-list.md), [SQL-026](sql/SQL-026-cp-claimprofile-get-sc-book.md), [SQL-027](sql/SQL-027-cp-get-agent-online-policy-list.md), [SQL-028](sql/SQL-028-fee-auditor-policy-list.md) |
| **Source** | `SAIF.Business.View.Policy/clsPolicySecurity.vb` |

---

## BR-VP-006 Auditor 60-day access window

| Field | Value |
| --- | --- |
| **Statement** | An auditor may access a policy only within a 60-day window around the cancellation/completion date of the audit. |
| **Trigger** | Auditor authorization check |
| **Enforcement** | `clsPolicySecurity.vb` — `CanAuditorAccessPolicy` |
| **Outcome** | Access denied outside the window |
| **Tables** | [PA_AUDIT](database-tables.md#pa_audit), [PA_AUDITOR](database-tables.md#pa_auditor), [PA_POLICY_PERIOD](database-tables.md#pa_policy_period) |
| **SQL** | [SQL-024](sql/SQL-024-auditor-access-count.md) |
| **Source** | `SAIF.Business.View.Policy/clsPolicySecurity.vb` |

---

## BR-VP-007 Loss control prefix match

| Field | Value |
| --- | --- |
| **Statement** | A loss control consultant may access a policy when the assigned consultant's user name matches the consultant prefix stored on the policy, truncated at the `%` character. |
| **Trigger** | Loss control authorization check |
| **Enforcement** | `clsPolicySecurity.vb` — `IsPolicyValidForUser` |
| **Outcome** | Access granted on prefix match |
| **SQL** | [SQL-031](sql/SQL-031-team-assign-query.md) |
| **Source** | `SAIF.Business.View.Policy/clsPolicySecurity.vb` |

---

## BR-VP-008 Demo loss control matched on UserIdName

| Field | Value |
| --- | --- |
| **Statement** | Demo loss control users are matched on `UserIdName` instead of `UserName`. |
| **Trigger** | Loss control authorization check for a demo user |
| **Enforcement** | `clsPolicySecurity.vb` — `IsPolicyValidForUser` |
| **Outcome** | Demo user matched against the demo identity |
| **Source** | `SAIF.Business.View.Policy/clsPolicySecurity.vb` |

---

## BR-VP-009 Fallback to parent-policy authorization

| Field | Value |
| --- | --- |
| **Statement** | If a user is not authorized for a policy directly, authorization is re-evaluated against the policy's parent policy. |
| **Trigger** | Policy authorization check fails directly |
| **Enforcement** | `clsPolicySecurity.vb` — `IsPolicyValidForParentPolicy` |
| **Outcome** | Access may still be granted through the parent |
| **SQL** | [SQL-013](sql/SQL-013-getparentpolicy.md) |
| **Source** | `SAIF.Business.View.Policy/clsPolicySecurity.vb` |

---

## BR-VP-010 Demo users see masked data

| Field | Value |
| --- | --- |
| **Statement** | Demo users see masked policy, address, agency and team member data. |
| **Trigger** | Retrieving data while the current user is a demo user type |
| **Enforcement** | `clsPolicyData.vb`, `clsPolicyAddress.vb`, `clsAgency.vb`, `clsTeamAssignment.vb` — `MaskData` using `clsConstants.DataMaskingConstants` |
| **Outcome** | Sensitive values replaced with masking constants |
| **Source** | `SAIF.Business.View.Policy/clsPolicyData.vb` |

---

## BR-VP-011 Policy always affiliated with itself

| Field | Value |
| --- | --- |
| **Statement** | A policy is always at least affiliated with itself. |
| **Trigger** | Building the affiliated policy list |
| **Enforcement** | `clsPolicyData.vb` — affiliate list logic |
| **Outcome** | The source policy is always present in the affiliate list |
| **SQL** | [SQL-001](sql/SQL-001-getpolicyaffiliatelist.md) |
| **Source** | `SAIF.Business.View.Policy/clsPolicyData.vb` |

---

## BR-VP-012 Affiliated policy list filtered by agentagency

| Field | Value |
| --- | --- |
| **Statement** | The affiliated policy list is filtered by the requesting agent or agency. |
| **Trigger** | Building the affiliated policy list for an agent user |
| **Enforcement** | `clsPolicyData.vb` — affiliate list logic |
| **Outcome** | Only affiliated policies belonging to the agent/agency remain |
| **SQL** | [SQL-001](sql/SQL-001-getpolicyaffiliatelist.md), [SQL-014](sql/SQL-014-getpolicyaffiliatetype.md) |
| **Source** | `SAIF.Business.View.Policy/clsPolicyData.vb` |

---

## BR-VP-013 DisplayAffiliatedPolices matrix controls display

| Field | Value |
| --- | --- |
| **Statement** | Whether affiliated policies are displayed is determined by the `DisplayAffiliatedPolices` user-type matrix. |
| **Trigger** | Requesting affiliated policies |
| **Enforcement** | `clsPolicyData.vb` — `DisplayAffiliatedPolices` (lines ~234-275) |
| **Outcome** | Affiliated policies shown or suppressed |
| **SQL** | [SQL-014](sql/SQL-014-getpolicyaffiliatetype.md) |
| **Source** | `SAIF.Business.View.Policy/clsPolicyData.vb` |

---

## BR-VP-014 Source policy excluded from associations by default

| Field | Value |
| --- | --- |
| **Statement** | The source policy is excluded from an association list unless the caller explicitly requests its inclusion. |
| **Trigger** | Building a policy association list |
| **Enforcement** | `PolicyAssociations.vb` — `GetPolicyAssociationList` (`IncludeSourcePolicy`) |
| **Outcome** | Source policy omitted by default |
| **Tables** | [POLICY_RELATIONSHIP](database-tables.md#policy_relationship), [POLICY](database-tables.md#policy) |
| **SQL** | [SQL-034](sql/SQL-034-policy-association-list.md) |
| **Source** | `SAIF.Business.View.Policy/PolicyAssociations.vb` |

---

## BR-VP-015 Preferred association type overrides derived type

| Field | Value |
| --- | --- |
| **Statement** | When a preferred association type is supplied it overrides the association type otherwise derived for the policy. |
| **Trigger** | Building association headers |
| **Enforcement** | `Associations/clsPolicyAssociationFactory.vb` — `clsPolicyHeaderAssociationFactory` |
| **Outcome** | Preferred type is used |
| **SQL** | [SQL-004](sql/SQL-004-non-typed-association-lookup.md) |
| **Source** | `SAIF.Business.View.Policy/Associations/clsPolicyAssociationFactory.vb` |

---

## BR-VP-016 Market type mapping

| Field | Value |
| --- | --- |
| **Statement** | A market type of `VOL` is Voluntary; any other market type is Assigned Risk. |
| **Trigger** | Mapping policy data after retrieve |
| **Enforcement** | `clsPolicyData.vb` (lines ~443-457) |
| **Outcome** | Market type display value set |
| **SQL** | [SQL-010](sql/SQL-010-getpolicy.md) |
| **Source** | `SAIF.Business.View.Policy/clsPolicyData.vb` |

---

## BR-VP-017 Future cancel date only for Pending Cancellation

| Field | Value |
| --- | --- |
| **Statement** | A future cancel date is only populated when the policy status is Pending Cancellation. |
| **Trigger** | Reading the future cancel date |
| **Enforcement** | `clsPolicyData.vb` — `GetFutureCancelDate` (lines ~643-760) |
| **Outcome** | Date returned only for pending cancellation, otherwise unset |
| **Tables** | [CANCELLATION](database-tables.md#cancellation) |
| **SQL** | [SQL-015](sql/SQL-015-secondary-policy-status.md), [SQL-020](sql/SQL-020-future-cancel-date.md) |
| **Source** | `SAIF.Business.View.Policy/clsPolicyData.vb` |

---

## BR-VP-018 Currentrenewal period selection

| Field | Value |
| --- | --- |
| **Statement** | A policy period is the current period when its status is "Open" and the renewal period when its status is "Renew". |
| **Trigger** | Selecting the current or renewal period |
| **Enforcement** | `clsPolicyData.vb` — `isCurrentPolicyPeriod`, `isRenewalPolicyPeriod` (lines ~1425-1505) |
| **Outcome** | Corresponding period is selected |
| **SQL** | [SQL-022](sql/SQL-022-getpolicyperiods.md) |
| **Source** | `SAIF.Business.View.Policy/clsPolicyData.vb` |

---

## BR-VP-019 Latest printed information-page period

| Field | Value |
| --- | --- |
| **Statement** | The latest policy period with a printed information page is selected by scanning the periods in order. |
| **Trigger** | Requesting the latest printed information page period |
| **Enforcement** | `clsPolicyData.vb` — `GetLatestPolicyPeriodInfoPagePrinted` |
| **Outcome** | Most recent qualifying period returned |
| **SQL** | [SQL-017](sql/SQL-017-info-page-printed.md), [SQL-022](sql/SQL-022-getpolicyperiods.md) |
| **Source** | `SAIF.Business.View.Policy/clsPolicyData.vb` |

---

## BR-VP-020 Association type is secured when security group set

| Field | Value |
| --- | --- |
| **Statement** | An association type is a secured type when its security group name is not blank. |
| **Trigger** | Evaluating an association type |
| **Enforcement** | `Associations/clsAssociationTypeCode.vb` — `AssociationTypeExtensions.IsSecuredType` |
| **Outcome** | Type treated as secured |
| **Tables** | [ASSOCIATION_TYPE_CODE](database-tables.md#association_type_code) |
| **SQL** | [SQL-005](sql/SQL-005-association-type-code-lookup.md) |
| **Source** | `SAIF.Business.View.Policy/Associations/clsAssociationTypeCode.vb` |

---

## BR-VP-021 Association category prefix classification

| Field | Value |
| --- | --- |
| **Statement** | Association categories are identified by prefix: `MR` is a manual relationship and `PR` is a policy relationship; manual categories use the prefix "M". |
| **Trigger** | Classifying an association type code |
| **Enforcement** | `Associations/clsAssociationTypeCode.vb` — category constants and `ToAssociationCategoryPrefixCode` |
| **Outcome** | Association classified as manual or policy relationship |
| **SQL** | [SQL-005](sql/SQL-005-association-type-code-lookup.md) |
| **Source** | `SAIF.Business.View.Policy/Associations/clsAssociationTypeCode.vb` |

---

## BR-VP-022 Team member email address derivation

| Field | Value |
| --- | --- |
| **Statement** | A team member's email address is derived from the assigned unit: `SERVIC`, `SCLC` and `SAFETYSERVICES` produce an `@saif.com` address; non-SAIF members are resolved by external client lookup; all other, inactive or blank entries produce an empty address. |
| **Trigger** | Initialising a team assignment |
| **Enforcement** | `clsTeamAssignment.vb` — `InitializeEmailAddress`, `InitializeEmailAddressUsingSystemUser` |
| **Outcome** | Email address set or left empty |
| **SQL** | [SQL-029](sql/SQL-029-cp-external-client-lookup.md), [SQL-030](sql/SQL-030-sp73341-external-client-lookup.md) |
| **Source** | `SAIF.Business.View.Policy/clsTeamAssignment.vb` |

---

## BR-VP-023 Login date on or before 2000-01-01 is never logged in

| Field | Value |
| --- | --- |
| **Statement** | A login date on or before 1 January 2000 is treated as "never logged in". |
| **Trigger** | Reading policyholder login dates |
| **Enforcement** | `clsPolicyData.vb` — login date properties |
| **Outcome** | Date treated as no login |
| **Source** | `SAIF.Business.View.Policy/clsPolicyData.vb` |

---

## BR-VP-024 Default association dates

| Field | Value |
| --- | --- |
| **Statement** | When association dates are not supplied, the endorsement/combination date defaults to the data source date and the combined policy period date defaults to the maximum policy period effective date. |
| **Trigger** | Retrieving associations without explicit dates |
| **Enforcement** | `PolicyAssociations.vb` — `GetPolicyAssociationList`, `GetMaxPolicyEffectiveDate` |
| **Outcome** | Default dates applied to the query |
| **Tables** | [POLICY_PERIOD](database-tables.md#policy_period) |
| **SQL** | [SQL-034](sql/SQL-034-policy-association-list.md), [SQL-035](sql/SQL-035-max-policy-effective-date.md) |
| **Source** | `SAIF.Business.View.Policy/PolicyAssociations.vb` |

---

## BR-VP-025 Missing agency row records a No data found error

| Field | Value |
| --- | --- |
| **Statement** | When no agency row is returned for a policy, a "No data found" error message is added to the object. |
| **Trigger** | Retrieving agency data |
| **Enforcement** | `clsAgency.vb` — `AfterRetrieve` (`AddErrorMessage("NoDataFoundError", "No data found")`) |
| **Outcome** | Error message recorded on the business object |
| **SQL** | [SQL-002](sql/SQL-002-getagency.md) |
| **Source** | `SAIF.Business.View.Policy/clsAgency.vb` |

---

## BR-VP-026 Detail-read failure does not fail overall retrieve

| Field | Value |
| --- | --- |
| **Statement** | Failure to read policy detail does not fail the overall policy retrieve. |
| **Trigger** | Lazy reading policy detail |
| **Enforcement** | `clsPolicyData.vb` — `LazyRead(PolicyDetail)` |
| **Outcome** | Exception swallowed; detail fields remain unset |
| **SQL** | [SQL-011](sql/SQL-011-getviewdetail.md) |
| **Source** | `SAIF.Business.View.Policy/clsPolicyData.vb` |

---

## BR-VP-027 CreateInsertUpdateDelete SQL are invalid

| Field | Value |
| --- | --- |
| **Statement** | The create, insert, update and delete SQL properties of this library's criteria are not valid operations. |
| **Trigger** | Any attempt to persist through these business objects |
| **Enforcement** | All `Criteria` classes in `SAIF.Business.View.Policy` |
| **Outcome** | Empty statement returned or `ApplicationException(clsConstants.Messages.InvalidSQLProperty)` thrown |
| **Source** | `SAIF.Business.View.Policy/clsPolicyData.vb` |

## Stored procedure business rules

Rules sourced from Oracle and SQL Server stored procedures referenced by this library.

| Rule ID | Rule | Source | Link |
| --- | --- | --- | --- |
| PR-BVP-001 | Cancel-status derivation is dispatched on the policy status group | `sp72268_get_cancel_status` | [Details](procedures/sp72268-get-cancel-status.md#business-rules) |
| PR-BVP-002 | Cancelled policies use the full cancel-status precedence chain | `sp72268_get_cancel_status` | [Details](procedures/sp72268-get-cancel-status.md#business-rules) |
| PR-BVP-003 | A policy is *Judgment* status when a judgment legal action is open | `sp72268_get_cancel_status` | [Details](procedures/sp72268-get-cancel-status.md#business-rules) |
| PR-BVP-004 | A policy is *Lien* status when an open lien legal action exists | `sp72268_get_cancel_status` | [Details](procedures/sp72268-get-cancel-status.md#business-rules) |
| PR-BVP-005 | A policy is *Defaulted* when the demand response indicates default | `sp72268_get_cancel_status` | [Details](procedures/sp72268-get-cancel-status.md#business-rules) |
| PR-BVP-006 | A policy is *Demanded* when a demand exists with no response recorded | `sp72268_get_cancel_status` | [Details](procedures/sp72268-get-cancel-status.md#business-rules) |
| PR-BVP-007 | A policy is *Pending Audit* when a physical audit is outstanding before cancellation | `sp72268_get_cancel_status` | [Details](procedures/sp72268-get-cancel-status.md#business-rules) |
| PR-BVP-008 | A policy is *Pending PR* when an audit is outstanding but is not a physical audit | `sp72268_get_cancel_status` | [Details](procedures/sp72268-get-cancel-status.md#business-rules) |
| PR-BVP-009 | A cancelled policy carrying a balance is reported as *Closed with Balance* | `sp72268_get_cancel_status` | [Details](procedures/sp72268-get-cancel-status.md#business-rules) |
| PR-BVP-010 | Application-status policies not owned by WCIS are reported as `saifQuote` | `sp72268_get_cancel_status` | [Details](procedures/sp72268-get-cancel-status.md#business-rules) |
| PR-BVP-011 | Unhandled errors are surfaced as an application error, not silently swallowed | `sp72268_get_cancel_status` | [Details](procedures/sp72268-get-cancel-status.md#business-rules) |
| PR-BVP-012 | Coverage-bound indicator is delegated to the shared bound check | `sp73089_get_policy_bound_flag` | [Details](procedures/sp73089-get-policy-bound-flag.md#business-rules) |
| PR-BVP-013 | Information-page printed indicator is delegated to `sp72253_info_page_printed` | `SP72347_INFO_PAGE_PRINTED_YN` | [Details](procedures/sp72347-info-page-printed-yn.md#business-rules) |
| PR-BVP-014 | Unhandled errors are surfaced as an application error | `SP72347_INFO_PAGE_PRINTED_YN` | [Details](procedures/sp72347-info-page-printed-yn.md#business-rules) |
| PR-BVP-015 | External client identity is sourced from `system_user_contractor`, replacing the legacy `net_registrant` source | `sp73341_external_client_lookup` | [Details](procedures/sp73341-external-client-lookup.md#business-rules) |
| PR-BVP-016 | A lookup miss yields NULL rather than an error | `sp73341_external_client_lookup` | [Details](procedures/sp73341-external-client-lookup.md#business-rules) |
| PR-BVP-017 | Monetary header values are null-safe | `pk73094_policy_data.getpolicy` | [Details](procedures/pk73094-policy-data.md#business-rules) |
| PR-BVP-018 | Cancel status on the policy header is always the shared derivation, never a stored column | `pk73094_policy_data.getpolicy` | [Details](procedures/pk73094-policy-data.md#business-rules) |
| PR-BVP-019 | SIC code is deliberately not returned by this view | `pk73094_policy_data.getpolicy` | [Details](procedures/pk73094-policy-data.md#business-rules) |
| PR-BVP-020 | The "best" policy for an account is chosen by a fixed ranking | `pk73094_policy_data.get_account_name` | [Details](procedures/pk73094-policy-data.md#business-rules) |
| PR-BVP-021 | A null account number yields no name | `pk73094_policy_data.get_account_name` | [Details](procedures/pk73094-policy-data.md#business-rules) |
| PR-BVP-022 | Affiliate type defaults to non-affiliated | `pk72846_view_policy.getpolicyaffiliatetype` | [Details](procedures/pk72846-view-policy.md#business-rules) |
| PR-BVP-023 | Policyholder-user callers get PHP affiliation resolved first | `pk72846_view_policy.getpolicyaffiliatetype` | [Details](procedures/pk72846-view-policy.md#business-rules) |
| PR-BVP-024 | Wrap-up and leasing relationships are classified parent vs member by self-reference | `pk72846_view_policy.getpolicyaffiliatetype` | [Details](procedures/pk72846-view-policy.md#business-rules) |
| PR-BVP-025 | Sub-account and out-of-region relationships use the same self-reference test | `pk72846_view_policy.getpolicyaffiliatetype` | [Details](procedures/pk72846-view-policy.md#business-rules) |
| PR-BVP-026 | Combination-rated policies are classified from the rate account | `pk72846_view_policy.getpolicyaffiliatetype` | [Details](procedures/pk72846-view-policy.md#business-rules) |
| PR-BVP-027 | Minimum-premium combo membership is resolved from the latest combo period | `pk72846_view_policy.getpolicyaffiliatetype` | [Details](procedures/pk72846-view-policy.md#business-rules) |
| PR-BVP-028 | Parent policy is resolved from the affiliate type | `pk72846_view_policy.getparentpolicy` | [Details](procedures/pk72846-view-policy.md#business-rules) |
| PR-BVP-029 | A policy that is not a member is its own parent | `pk72846_view_policy.getparentpolicy` | [Details](procedures/pk72846-view-policy.md#business-rules) |
| PR-BVP-030 | Flat-cancelled and prospect periods never participate in gap calculation | `pk72846_view_policy.getgaps` | [Details](procedures/pk72846-view-policy.md#business-rules) |
| PR-BVP-031 | Coverage gaps combine computed gaps with explicitly recorded gaps | `pk72846_view_policy.getgaps` | [Details](procedures/pk72846-view-policy.md#business-rules) |
| PR-BVP-032 | Claim address requests fall back to the policy address when no current claim location exists | `pk72846_view_policy.getpolicyaddress` | [Details](procedures/pk72846-view-policy.md#business-rules) |
| PR-BVP-033 | A missing contact first name displays as `Policyholder` | `pk72846_view_policy.getpolicyaddress` | [Details](procedures/pk72846-view-policy.md#business-rules) |
| PR-BVP-034 | Only currently effective locations are returned, most recent first | `pk72846_view_policy.getpolicyaddress` | [Details](procedures/pk72846-view-policy.md#business-rules) |
| PR-BVP-035 | Zero means "return every period" | `pk72846_view_policy.getpolicyperiods` | [Details](procedures/pk72846-view-policy.md#business-rules) |
| PR-BVP-036 | Rating values are masked unless the information page has printed | `pk72846_view_policy.getpolicyperiods` | [Details](procedures/pk72846-view-policy.md#business-rules) |
| PR-BVP-037 | Tentatively rated plans are flagged with an asterisk | `pk72846_view_policy.getpolicyperiods` | [Details](procedures/pk72846-view-policy.md#business-rules) |
| PR-BVP-038 | Only screen-ordered team rows are returned for a policy | `pk72846_view_policy.team_assign_query` | [Details](procedures/pk72846-view-policy.md#business-rules) |
| PR-BVP-039 | Agent of record is resolved through the commission authorization package and excludes agent zero | `pk72846_view_policy.team_assign_query` | [Details](procedures/pk72846-view-policy.md#business-rules) |
| PR-BVP-040 | Agency phone falls back to the location phone when no statement address sequence exists | `pk72846_view_policy.team_assign_query` | [Details](procedures/pk72846-view-policy.md#business-rules) |
| PR-BVP-041 | Waiver presence is a count over waiver detail | `Pk82033_ThirdParty.get_policy_waiver_count` | [Details](procedures/pk82033-thirdparty.md#business-rules) |
| PR-BVP-042 | Employer-liability limits resolve through a six-branch precedence union | `coveragelimits_pkg.getSpecificLimitsForPolicyNum` | [Details](procedures/coveragelimits-pkg.md#business-rules) |
| PR-BVP-043 | Limit amounts are returned pre-formatted for display | `coveragelimits_pkg.getSpecificLimitsForPolicyNum` | [Details](procedures/coveragelimits-pkg.md#business-rules) |
| PR-BVP-044 | Group membership evaluation reads uncommitted data by design | `cp_policy_in_group` | [Details](procedures/cp-policy-in-group.md#business-rules) |
| PR-BVP-045 | The query variant is selected by how the supplied group id is registered | `cp_policy_in_group` | [Details](procedures/cp-policy-in-group.md#business-rules) |
| PR-BVP-046 | Group parents are excluded from group evaluation | `cp_policy_in_group` | [Details](procedures/cp-policy-in-group.md#business-rules) |
| PR-BVP-047 | Only the most recent covered policy period participates | `cp_policy_in_group` | [Details](procedures/cp-policy-in-group.md#business-rules) |
| PR-BVP-048 | A non-zero count means the policy is in the group | `cp_policy_in_group` | [Details](procedures/cp-policy-in-group.md#business-rules) |
| PR-BVP-049 | The report date is normalised to a date without time | `cp_claimprofile_get_group_policy_list` | [Details](procedures/cp-claimprofile-get-group-policy-list.md#business-rules) |
| PR-BVP-050 | A policy period qualifies if it is the most recent covered period, or the last period in the group still within the report window | `cp_claimprofile_get_group_policy_list` | [Details](procedures/cp-claimprofile-get-group-policy-list.md#business-rules) |
| PR-BVP-051 | Only active policies with unexpired group membership are listed | `cp_claimprofile_get_group_policy_list` | [Details](procedures/cp-claimprofile-get-group-policy-list.md#business-rules) |
| PR-BVP-052 | The placeholder chapter code `NC` is not shown to users | `cp_claimprofile_get_group_policy_list` | [Details](procedures/cp-claimprofile-get-group-policy-list.md#business-rules) |
| PR-BVP-053 | The loss-control filter supports wildcard matching | `cp_claimprofile_get_sc_book` | [Details](procedures/cp-claimprofile-get-sc-book.md#business-rules) |
| PR-BVP-054 | Flat-cancelled periods are excluded from the safety-consultant book | `cp_claimprofile_get_sc_book` | [Details](procedures/cp-claimprofile-get-sc-book.md#business-rules) |
| PR-BVP-055 | Only active policies with an assigned loss-control consultant are listed | `cp_claimprofile_get_sc_book` | [Details](procedures/cp-claimprofile-get-sc-book.md#business-rules) |
| PR-BVP-056 | The list combines active policies and policies closed within the last five years | `cp_get_agent_online_policy_list` | [Details](procedures/cp-get-agent-online-policy-list.md#business-rules) |
| PR-BVP-057 | `@ForAgency` switches the identifier between agency and agent | `cp_get_agent_online_policy_list` | [Details](procedures/cp-get-agent-online-policy-list.md#business-rules) |
| PR-BVP-058 | Rate information is viewable only for the policy's own rate account or an in-book rate account | `cp_get_agent_online_policy_list` | [Details](procedures/cp-get-agent-online-policy-list.md#business-rules) |
| PR-BVP-059 | Sales plan is derived from the policy plan description | `cp_get_agent_online_policy_list` | [Details](procedures/cp-get-agent-online-policy-list.md#business-rules) |
| PR-BVP-060 | A policy in status `3` is flagged as pending cancel | `cp_get_agent_online_policy_list` | [Details](procedures/cp-get-agent-online-policy-list.md#business-rules) |
| PR-BVP-061 | Current certificates flag reflects existence of certificate detail rows | `cp_get_agent_online_policy_list` | [Details](procedures/cp-get-agent-online-policy-list.md#business-rules) |
| PR-BVP-062 | Group name is shown only for unexpired group memberships | `cp_get_agent_online_policy_list` | [Details](procedures/cp-get-agent-online-policy-list.md#business-rules) |
| PR-BVP-063 | Only one active, non-test registrant is returned — the most recently updated | `cp_external_client_lookup` | [Details](procedures/cp-external-client-lookup.md#business-rules) |
| PR-BVP-064 | All association types grouped into one category must resolve to a single source procedure | `clsAssociationTypeCode` (dynamic dispatch) | [Details](procedures/association-type-code-source-procedure-name.md#business-rules) |

## Notes
- All 35 SQL statements in this library are Read-only; there are zero Create/Insert/Update/Delete statements, consistent with [BR-VP-027](#br-vp-027-createinsertupdatedelete-sql-are-invalid).
- Statements marked with `*` were inferred from code structure, naming conventions, or contextual evidence where direct confirmation was not available in source artifacts. Statements marked with `**` could not be confirmed; treat as unknown until verified.

## Related documentation
- [Index](index.md)
- [Overview](overview.md)
- [Architecture](architecture.md)
- [Dependencies](dependencies.md)
- [Configuration](configuration.md)
- [Operations and processes](operations-processes.md)
- [Security and authorization](security-authorization.md)
- [Database tables](database-tables.md)
- [SQL catalog](sql/index.md)
- [Procedures](procedures/index.md)
- [API reference](api/index.md)

## Sources
- `SAIF.Business.View.Policy/clsPolicyData.vb`
- `SAIF.Business.View.Policy/clsPolicySecurity.vb`
- `SAIF.Business.View.Policy/clsPolicyPeriod.vb`
- `SAIF.Business.View.Policy/clsTeamAssignment.vb`
- `SAIF.Business.View.Policy/clsTeamAssignmentCollection.vb`
- `SAIF.Business.View.Policy/Associations/clsPolicyAssociation.vb`
- `SAIF.Business.View.Policy/clsPolicySecurity.vb`
- `SAIF.Business.View.Policy/clsPolicyData.vb`
- `SAIF.Business.View.Policy/clsTeamAssignment.vb`
- `SAIF.Business.View.Policy/clsTeamAssignmentCollection.vb`
- `SAIF.Business.View.Policy/app.config`
- `SAIF.Business.View.Policy/Web.config`
